Feladványok megoldása (2)

 

Folytassuk tovább a metódusokkal való ismerkedést.

 

Pointing Triples (PT)

 

         A metódus: Ha egy tartományban egy jelölt csak három helyen van, de egy sorban vagy egy oszlopban, akkor a kijelölt sorban vagy oszlopban a többi helyről a jelölt törölhető. A következő feladványban a G1I3 tartományban a 6-os csak három cellában található (G3, H3 és I3), de mindegyik a 3-as sorban, ezért a teljes 3-as sor további celláiból törölhető. A törlés a piros hátterű cellákat érinti:

 

 

A PT bekapcsolása után ezt láthatjuk:

        

 

A Pointing Triples rutinja:

 

Procedure PointingTriples;
Var I, J, K, A, B, C, U, V, Z: Word;
Begin
  //Pointing Triples
  //ha egy tartomanyban egy szam csak harom helyen van, de egy sorban vagy egy
  //oszlopban, akkor a kijelolt sorban vagy oszlopban a tobbi helyrol a szam
  //torolheto
  For I:= 1 To MX Do If SM[I]=0 Then For J:= 1 To Max Do //J: keresendo szam
  If TartN(J,InT[I])=3 Then
  Begin
    A:= 0; B:= 0; C:= 0; U:= 0; V:= 0; Z:= 0; //a tartomanyon beluli helyek
    For K:= Max*((I-1) Div Max)+1 To Max*((I-1) Div Max)+Max Do
    If SH[K,J]=1 Then If A=0 Then
    Begin U:= K; A:= InX[K] End Else If B=0 Then
    Begin V:= K; B:= InX[K] End Else
    Begin Z:= K; C:= InX[K] End;
    If (A<>0) And (B<>0) And (A=B) And (A=C) Then //egy oszlop
    For K:= 1 To MX Do If SM[K]=0 Then
    If (InX[K]=A) And (K<>U) And (K<>V) And (K<>Z) Then
    Begin SH[K][J]:= 0 End;

    A:= 0; B:= 0; C:= 0; U:= 0; V:= 0; Z:= 0; //a tartomanyon beluli helyek
    For K:= Max*((I-1) Div Max)+1 To Max*((I-1) Div Max)+Max Do
    If SH[K,J]=1 Then If A=0 Then
    Begin U:= K; A:= InY[K] End Else If B=0 Then
    Begin V:= K; B:= InY[K] End Else
    Begin Z:= K; C:= InY[K] End;
    If (A<>0) And (B<>0) And (A=B) And (A=C) Then //egy sor
    For K:= 1 To MX Do If SM[K]=0 Then
    If (InY[K]=A) And (K<>U) And (K<>V) And (K<>Z) Then
    Begin SH[K][J]:= 0 End;
  End;
End;

Naked Triples (NT)

 

         A metódus: Ha egy szobában, három cellában (egy sorban, egy oszlopban vagy egy tartományban) van csak ugyanaz a három jelölt, akkor a többi cellából ezek a jelöltek törölhetők. A következő feladványban az A5, B5 és C5 cellákban csak a 2, 8 és 9 jelöltek találhatók, ezért az A4C6 tartományból és az 5-ös sor további celláiból a jelöltek törölhetők. A törlés a piros hátterű cellákat érinti:

 

 

Az NT bekapcsolása után ezt látjuk:

 

 

A Naked Triples rutinja:

 

Procedure NakedTriples;
Var I, J, K, L: Word;
Begin
  //Naked Triples
  //ha egy szobaban harom helyen van csak ugyanaz a harom szam,
  //akkor a tobbi helyrol ezek a szamok torolhetok
  For I:= 1 To MX-2 Do If SM[I]=0 Then If Osszeg(SH[I])=3 Then
  For J:= I+1 To Mx-1 Do If SM[J]=0 Then If Osszeg(SH[J])=3 Then
  For K:= J+1 To MX Do If SM[K]=0 Then If Osszeg(SH[K])=3 Then
  Begin
    If (InX[I]=InX[J]) And (InX[J]=InX[K]) And  //ha egy oszlopban vannak
    Egyenlo(SH[I],SH[J]) And Egyenlo(SH[J],SH[K]) Then  //és egyenlok
    For L:= 1 To MX Do If SM[L]=0 Then
    If (InX[L]=InX[K]) And (L<>I) And (L<>J) And (L<>K) Then
    Begin SH[L]:= Kivesz(SH[L],SH[K]) End;
    If (InY[I]=InY[J]) And (InY[J]=InY[K]) And  //ha egy sorban vannak
    Egyenlo(SH[I],SH[J]) And Egyenlo(SH[J],SH[K]) Then  //és egyenlok
    For L:= 1 To MX Do If SM[L]=0 Then
    If (InY[L]=InY[K]) And (L<>I) And (L<>J) And (L<>K) Then
    Begin SH[L]:= Kivesz(SH[L],SH[K]) End;
    If (InT[I]=InT[J]) And (InT[J]=InT[K]) And  //ha egy tartomanyban vannak
    Egyenlo(SH[I],SH[J]) And Egyenlo(SH[J],SH[K]) Then  //és egyenlok
    For L:= 1 To MX Do If SM[L]=0 Then
    If (InT[L]=InT[K]) And (L<>I) And (L<>J) And (L<>K) Then
    Begin SH[L]:= Kivesz(SH[L],SH[K]) End;
  End;
End;

 

Hidden Triples (HT)

 

         A metódus: Ha egy szobában csak három cellában (egy sorban, egy oszlopban vagy egy tartományban) található három jelölt (de más még lehet), akkor a szoba ezen három mezőjéből minden más jelölt törölhető. A következő feladvány a H oszlopában az 1, 4 és 8-as jelölt csak a 6, 8 és 9-es sorban található. Nem mindegyikben mind a három, a 6-os sorban az 1-es és a 8-as jelölt, a 8-as sorban mind a három, míg a 9-es sorban a 4-es és a 8-as jelölt. A piros háttérszínű cellákban tehát csökkenni fog a jelöltek száma.

 

 

A HT bekapcsolása után ezt láthatjuk:

 

 

A Hidden Triples rutinja:

 

Procedure HiddenTriples;
Var I, J, K, L, M, N, S: Word;
    Q: TTomb;
    OFi, SFi, TFi: Array[1..Max] Of Boolean;
Begin
  //Hidden Triples
  For I:= 1 To Max Do Begin OFi[I]:= False; SFi[I]:= False; TFi[I]:= False End;
  //ha egy szobaban csak harom helyen talalhato harom szam (de mas meg lehet),
  //akkor ezen harom helyrol a tobbi szam torolheto
  For I:= 1 To MX Do If SM[I]=0 Then
  For J:= 1 To Max Do For K:= 1 To Max Do For L:= 1 To Max Do
  If (K<>J) And (L<>J) And (L<>K) Then //J,K,L: a keresett szamok
  Begin
    //ha a harom szám legfeljebb harom helyen van es egy oszlopban
    If Not OFi[InX[I]] Then
    If ((OszlopN(J,InX[I])>0) And (OszlopN(J,InX[I])<4)) And
       ((OszlopN(K,InX[I])>0) And (OszlopN(K,InX[I])<4)) And
       ((OszlopN(L,InX[I])>0) And (OszlopN(L,InX[I])<4)) Then
    Begin
      Q:= CS; For M:= 1 To MX Do If SM[M]=0 Then
      If (InX[M]=InX[I]) Then
      If (SH[M,J]=1) Or (SH[M,K]=1) Or (SH[M,L]=1) Then Q[M]:= 1;
      S:= 0; For M:= 1 To MX Do S:= S+Q[M];
      If S=3 Then For M:= 1 To MX Do If Q[M]=1 Then For N:= 1 To Max Do
      If (N<>J) And (N<>K) And (N<>L) Then
      Begin SH[M,N]:= 0;
        OFi[InX[I]]:= True
      End;
    End;
    //ha a harom szam legfeljebb harom helyen van es egy sorban
    If Not SFi[InY[I]] Then
    If ((SorN(J,InY[I])>0) And (SorN(J,InY[I])<4)) And
       ((SorN(K,InY[I])>0) And (SorN(K,InY[I])<4)) And
       ((SorN(L,InY[I])>0) And (SorN(L,InY[I])<4)) Then
    Begin
      Q:= CS; For M:= 1 To MX Do If SM[M]=0 Then If (InY[M]=InY[I]) Then
      If (SH[M,J]=1) Or (SH[M,K]=1) Or (SH[M,L]=1) Then Q[M]:= 1;
      S:= 0; For M:= 1 To MX Do S:= S+Q[M];
      If S=3 Then For M:= 1 To MX Do If Q[M]=1 Then For N:= 1 To Max Do
      If (N<>J) And (N<>K) And (N<>L) Then
      Begin SH[M,N]:= 0; SFi[InY[I]]:= True End;
    End;
    //ha a harom szam legfeljebb harom helyen van es egy tartomanyban
    If Not TFi[InT[I]] Then
    If ((TartN(J,InT[I])>0) And (TartN(J,InT[I])<4)) And
       ((TartN(K,InT[I])>0) And (TartN(K,InT[I])<4)) And
       ((TartN(L,InT[I])>0) And (TartN(L,InT[I])<4)) Then
    Begin
      Q:= CS; For M:= 1 To MX Do If SM[M]=0 Then If (InT[M]=InT[I]) Then
      If (SH[M,J]=1) Or (SH[M,K]=1) Or (SH[M,L]=1) Then Q[M]:= 1;
      S:= 0; For M:= 1 To MX Do S:= S+Q[M];
      If S=3 Then For M:= 1 To MX Do If Q[M]=1 Then For N:= 1 To Max Do
      If (N<>J) And (N<>K) And (N<>L) Then
      Begin SH[M,N]:= 0; TFi[InT[I]]:= True End;
    End;
  End;
End;

 

Naked Quads (NQ)

 

         A metódus: Ha egy szobában van olyan négy nem üres cella (egy sorban, egy oszlopban vagy egy tartományban), amelyben összesen négy jelölt van, akkor a többi helyről ezek a jelöltek törölhetők. A következő feladvány A7C9 tartományának az A9, B7, B8 és C9 olyan négy nem üres cellája, amelyekben csak az 1, 2, 4 és 9-es jelöltek találhatók. Ezért az A7C9 tartomány további celláiból ez a négy jelölt törölhet. Ez aktuálisan azt jelenti, hogy a C8-as mezőből (piros a háttérszíne) a 2-es és 4-es jelölt törölhető.

 

 

Az NQ bekapcsolása után ezt láthatjuk:

 

 

Természetesen ez nem csak tartományra, hanem sorra és oszlopra is érvényes, ha a négy cella egy sorban vagy egy oszlopban található. Gyakran nagyon hatékony ez a metódus. Lássunk erre egy példát. A következő feladványban a piros hátterű cellákban fog csökkeni a jelöltek száma:

 

 

Az NQ bekapcsolása után ezt láthatjuk:

 

 

Észrevehetjük, hogy az NQ bekapcsolása előtt csak 2 jelölt volt Beírható a feladványban, most viszont 11, azaz ez a metódus nagymértékben hozzájárult a jelöltek számának csökkentéséhez.

 

A Naked Quads rutinja:

 

Function Negyes(A, B, C, D: KTomb): Boolean;
Var I: Word;
    P: KTomb;
Begin
  P:= CH; For I:= 1 To Max Do
  If (A[I]=1) Or (B[I]=1) Or (C[I]=1) Or (D[I]=1) Then P[I]:= 1;
  Negyes:= Osszeg(P)=4;
End;

 

Procedure NakedQuads;
Var I, J, K, L, M, N: Word;
    P: KTomb;
Begin
  //Naked Quads
  //ha egy szobaban van olyan negy nem ures cella, amelyben osszesen negy szám
  //van, akkor a tobbi helyrol ezek a szamok torolhetok
  For I:= 1 To MX-3 Do If SM[I]=0 Then If Osszeg(SH[I])>0 Then
  For J:= I+1 To MX-2 Do If SM[J]=0 Then If Osszeg(SH[J])>0 Then
  For K:= J+1 To MX-1 Do If SM[K]=0 Then If Osszeg(SH[K])>0 Then
  For L:= K+1 To MX Do If SM[L]=0 Then If Osszeg(SH[L])>0 Then
  Begin
    If (InX[I]=InX[J]) And (InX[J]=InX[K]) And //ha egy oszlopban vannak
    (InX[K]=InX[L]) And Negyes(SH[I],SH[J],SH[K],SH[L]) Then
    For M:= 1 To MX Do If SM[M]=0 Then
    If (InX[M]=InX[L]) And (M<>I) And (M<>J) And (M<>K) And (M<>L) Then
    Begin
      P:= CH; For N:= 1 To Max Do
      If (SH[I][N]=1) Or (SH[J][N]=1) Or (SH[K][N]=1) Or (SH[L][N]=1) Then
      P[N]:= 1; SH[M]:= Kivesz(SH[M],P);
    End;
    If (InY[I]=InY[J]) And (InY[J]=InY[K]) And //ha egy sorban vannak
    (InY[K]=InY[L]) And Negyes(SH[I],SH[J],SH[K],SH[L]) Then
    For M:= 1 To MX Do If SM[M]=0 Then
    If (InY[M]=InY[L]) And (M<>I) And (M<>J) And (M<>K) And (M<>L) Then
    Begin
      P:= CH; For N:= 1 To Max Do
      If (SH[I][N]=1) Or (SH[J][N]=1) Or (SH[K][N]=1) Or (SH[L][N]=1) Then
      P[N]:= 1; SH[M]:= Kivesz(SH[M],P);
    End;
    If (InT[I]=InT[J]) And (InT[J]=InT[K]) And //ha egy tartomanyban vannak
    (InT[K]=InT[L]) And Negyes(SH[I],SH[J],SH[K],SH[L]) Then
    For M:= 1 To MX Do If SM[M]=0 Then
    If (InT[M]=InT[L]) And (M<>I) And (M<>J) And (M<>K) And (M<>L) Then
    Begin
      P:= CH; For N:= 1 To Max Do
      If (SH[I][N]=1) Or (SH[J][N]=1) Or (SH[K][N]=1) Or (SH[L][N]=1) Then
      P[N]:= 1; SH[M]:= Kivesz(SH[M],P);
    End;
  End;
End;

 

Hidden Quads (HQ)

 

         A metódus: Ha egy szobában csak négy cellában (értelemszerűen egy sorban, egy oszlopban vagy egy tartományban) található négy jelölt (de más jelölt még lehet), akkor ezen négy cellából a többi jelölt törölhető. A következő feladvány a B4, B5, B6 és B9 celláiban található csak a 3, 4, 7 és 8-as jelölt, ezért a jelzett cellákból a többi jelölt törölhető. (A B5-ös cellában nem volt további jelölt.)

 

 

A HQ bekapcsolása után ezt láthatjuk:

 

 

A Hidden Quads rutinja:

 

Procedure HiddenQuads;
Var I, J, K, L, M, N, O, S: Word;
    Q: TTomb;
    OFi, SFi, TFi: Array[1..Max] Of Boolean;
Begin
  //Hidden Quads
  For I:= 1 To Max Do Begin OFi[I]:= False; SFi[I]:= False; TFi[I]:= False End;
  //ha egy szobaban csak negy helyen talalhato negy szam (de mas meg lehet),
  //akkor ezen negy helyrol a tobbi szam torolheto
  For I:= 1 To MX Do If SM[I]=0 Then
  For J:= 1 To Max Do For K:= 1 To Max Do
  For L:= 1 To Max Do For M:= 1 To Max Do
  If (K<>J) And
     (L<>J) And (L<>K) And
     (M<>J) And (M<>K) And (M<>L) Then //J,K,L,M: a keresett számok
  Begin
    //ha a negy szam legfeljebb negy helyen van es egy oszlopban
    If Not OFi[InX[I]] Then
    If ((OszlopN(J,InX[I])>0) And (OszlopN(J,InX[I])<5)) And
       ((OszlopN(K,InX[I])>0) And (OszlopN(K,InX[I])<5)) And
       ((OszlopN(L,InX[I])>0) And (OszlopN(L,InX[I])<5)) And
       ((OszlopN(M,InX[I])>0) And (OszlopN(M,InX[I])<5)) Then
    Begin
      Q:= CS; For N:= 1 To MX Do If SM[N]=0 Then If (InX[N]=InX[I]) Then
      If (SH[N,J]=1) Or (SH[N,K]=1) Or (SH[N,L]=1) Or (SH[N,M]=1)
      Then Q[N]:= 1;
      S:= 0; For N:= 1 To MX Do S:= S+Q[N];
      If S=4 Then For N:= 1 To MX Do If Q[N]=1 Then For O:= 1 To Max Do
      If (O<>J) And (O<>K) And (O<>L) And (O<>M) Then
      Begin SH[N,O]:= 0;
        OFi[InX[I]]:= True
      End;
    End;
    //ha a negy szam legfeljebb negy helyen van és egy sorban
    If Not SFi[InY[I]] Then
    If ((SorN(J,InY[I])>0) And (SorN(J,InY[I])<5)) And
       ((SorN(K,InY[I])>0) And (SorN(K,InY[I])<5)) And
       ((SorN(L,InY[I])>0) And (SorN(L,InY[I])<5)) And
       ((SorN(M,InY[I])>0) And (SorN(M,InY[I])<5)) Then
    Begin
      Q:= CS; For N:= 1 To MX Do If SM[N]=0 Then If (InY[N]=InY[I]) Then
      If (SH[N,J]=1) Or (SH[N,K]=1) Or (SH[N,L]=1) Or (SH[N,M]=1)
      Then Q[N]:= 1;
      S:= 0; For N:= 1 To MX Do S:= S+Q[N];
      If S=4 Then For N:= 1 To MX Do If Q[N]=1 Then For O:= 1 To Max Do
      If (O<>J) And (O<>K) And (O<>L) And (O<>M) Then
      Begin SH[N,O]:= 0;
        SFi[InY[I]]:= True
      End;
    End;
    //ha a negy szám legfeljebb negy helyen van és egy tartomanyban
    If Not TFi[InT[I]] Then
    If ((TartN(J,InT[I])>0) And (TartN(J,InT[I])<5)) And
       ((TartN(K,InT[I])>0) And (TartN(K,InT[I])<5)) And
       ((TartN(L,InT[I])>0) And (TartN(L,InT[I])<5)) And
       ((TArtN(M,InT[I])>0) And (TartN(M,InT[I])<5)) Then
    Begin
      Q:= CS; For N:= 1 To MX Do If SM[N]=0 Then If (InT[N]=InT[I]) Then
      If (SH[N,J]=1) Or (SH[N,K]=1) Or (SH[N,L]=1) Or (SH[N,M]=1)
      Then Q[N]:= 1;
      S:= 0; For N:= 1 To MX Do S:= S+Q[N];
      If S=4 Then For N:= 1 To MX Do If Q[N]=1 Then For O:= 1 To Max Do
      If (O<>J) And (O<>K) And (O<>L) And (O<>M) Then
      Begin SH[N,O]:= 0;
        SFi[InT[I]]:= True
      End;
    End;
  End;
End;

 

Box Line Reduction Pairs (BP)

 

         A metódus: Ha egy oszlopban vagy sorban egy szám kétszer egy tartományon belül ismétlődik, és csak kétszer szerepel az oszlopban vagy sorban, akkor a tartományon belül a többi helyről törölhető. A következő feladvány B oszlopában az 1-es csak kétszer fordul elő (B5 és B6) és ez a két hely egy tartományon belül van (A4C6-ban), ezért ebben a tartományban minden más helyről az 1-es törölhető. Azaz a piros hátterű cellákból törlődnek az 1-esek.

 

 

A BP bekapcsolása után ezt látjuk:

 

 

Ebben a feladványban még további két tartományban figyelhető meg a BP hatása: a D1F3 és G7I9 tartományokban. Az F1 és F3-ban található 4-es miatt a D1 és D3-ból törlődött a négyes, a D3 és F3-ban található 5-ös miatt törlődik az F2-ben az 5-ös.

 

 

A BP bekapcsolása után ezt láthatjuk:

 

 

Hasonlóan a G7I9 tartományban a G8 és I8-ban lévő 4-es miatt törlődik a G9-ből a 4-es.

 

 

A BP bekapcsolása után ezt látjuk:

 

 

A Box Line Reduction Pairs rutinja:

 

Procedure BoxLRPairs;
Var I, J, K, A, B, U, V: Word;
Begin
  //Box Line Reduction Pairs
  //ha egy oszlopban vagy sorban egy szam ketszer egy tartomanyon belul
  //ismetlodik es csak ketszer szerepel az oszlopban vagy sorban,
  //akkor a tartomanyon belul a tobbi helyrol torolheto
  For I:= 1 To MX Do If SM[I]=0 Then For J:= 1 To Max Do //J: keresendo szam
  Begin
    If OszlopN(J,InX[I])=2 Then //oszlop szerint
    Begin
      A:= 0; B:= 0; U:= 0; V:= 0;
      For K:= 1 To MX Do If SM[K]=0 Then
      If (InX[K]=InX[I]) And (SH[K,J]=1) Then If A=0 Then
      Begin U:= K; A:= InT[K] End Else Begin V:= K; B:= InT[K] End;
      If (A<>0) And (A=B) Then //ha egy tartomanyban vannak
      For K:= 1 To MX Do If SM[K]=0 Then
      If InT[K]=A Then If (K<>U) And (K<>V) Then
      Begin SH[K,J]:= 0 End;
    End;
    If SorN(J,InY[I])=2 Then //sor szerint
    Begin
      A:= 0; B:= 0; U:= 0; V:= 0;
      For K:= 1 To MX Do If SM[K]=0 Then
      If (InY[K]=InY[I]) And (SH[K,J]=1) Then If A=0 Then
      Begin U:= K; A:= InT[K] End Else Begin V:= K; B:= InT[K] End;
      If (A<>0) And (A=B) Then //ha egy tartomanyban vannak
      For K:= 1 To MX Do If SM[K]=0 Then
      If InT[K]=A Then If (K<>U) And (K<>V) Then
      Begin SH[K,J]:= 0 End;
    End;
  End;
End;

 

 

Box Line Reduction Triples (BT)

 

         A metódus: Ha egy oszlopban vagy sorban egy jelölt háromszor egy tartományon belül ismétlődik, és csak háromszor szerepel az oszlopban vagy sorban, akkor a tartományon belül a többi helyről törölhető. A következő feladványban A B oszlopban a 8-as csak a B4, B5 és B6 cellákban található (és egy tartományban), ezért a 8-as az A4C6 tartomány további celláiból törölhető. Ezek a cellák a C4 és C6, piros háttérszínnel jelölve:

 

 

A BT bekapcsolása után ezt látjuk:

 

 

A Box Line Reduction Triples rutinja:

 

Procedure BoxLRTriples;
Var I, J, K, A, B, C, U, V, Z: Word;
Begin
  //Box Line Reduction Triples
  //ha egy oszlopban vagy sorban egy szam haromszor egy tartomanyon belul
  //ismetlodik es csak haromszor szerepel az oszlopban vagy sorban,
  //akkor a tartomanyon belul a tobbi helyrol torolheto
  For I:= 1 To MX Do If SM[I]=0 Then For J:= 1 To Max Do //J: keresendo szam
  Begin
    If OszlopN(J,InX[I])=3 Then //oszlop szerint
    Begin
      A:= 0; B:= 0; C:= 0; U:= 0; V:= 0; Z:= 0;
      For K:= 1 To MX Do If SM[K]=0 Then
      If (InX[K]=InX[I]) And (SH[K,J]=1) Then If A=0 Then
      Begin U:= K; A:= InT[K] End Else If B=0 Then
      Begin V:= K; B:= InT[K] End Else
      Begin Z:= K; C:= InT[K] End;
      If (A<>0) And (B<>0) And (A=B) And (A=C) Then //ha egy tartomanyban vannak
      For K:= 1 To MX Do If SM[K]=0 Then
      If InT[K]=A Then If (K<>U) And (K<>V) And (K<>Z) Then
      Begin SH[K,J]:= 0 End;
    End;
    If SorN(J,InY[I])=3 Then //sor szerint
    Begin
      A:= 0; B:= 0; C:= 0; U:= 0; V:= 0; Z:= 0;
      For K:= 1 To MX Do If SM[K]=0 Then
      If (InY[K]=InY[I]) And (SH[K,J]=1) Then If A=0 Then
      Begin U:= K; A:= InT[K] End Else If B=0 Then
      Begin V:= K; B:= InT[K] End Else
      Begin Z:= K; C:= Int[K] End;
      If (A<>0) And (B<>0) And (A=B) And (A=C) Then //ha egy tartomanyban vannak
      For K:= 1 To MX Do  If SM[K]=0 Then
      If InT[K]=A Then If (K<>U) And (K<>V) And (K<>Z) Then
      Begin SH[K,J]:= 0 End;
    End;
  End;
End;

X-Wing (XW)

 

         A metódus: Ha két jelölt két oszlopban pontosan kétszer-kétszer szerepel, de ugyanabban a két sorban, akkor a két sor további helyeiről a jelölt törölhető. A következő feladványban a az F és I oszlopban a 9-es jelölt kétszer-kétszer szerepel egy-egy sorban (F4, I4 és F6 I6), ezért a 9-es a 4-es és a 6-os sorok további helyeiről törölhető (piros hátterű cellák):

 

 

Az XW bekapcsolása után ezt látjuk:

 

 

Az X-Wing rutinja:

 

Procedure XWing;
Var I, J, K, L, M, A, B, C, D: Word;
Begin
  //X-Wing
  //ha ket szam ket oszlopban pontosan ketszer-ketszer szerepel, de ugyanabban
  //a ket sorban, akkor a ket sor tovabbi helyeirol a szam torolheto
  For I:= 1 To MX-1 Do If SM[I]=0 Then For J:= 1 To Max Do //J: keresett szám
  Begin
    If OszlopN(J,InX[I])=2 Then //oszlop szerint
    For K:= I+1 To MX Do If SM[K]=0 Then
    If (InX[K]<>InX[I]) And (OszlopN(J,InX[K])=2) Then //masik oszlop
    Begin
      A:= 0; B:= 0; C:= 0; D:= 0;
      For L:= 1 To MX Do If SM[L]=0 Then
      If (InX[L]=InX[I]) And (SH[L,J]=1) Then
      If A=0 Then A:= InY[L] Else B:= InY[L];
      For L:= 1 To MX Do If SM[L]=0 Then
      If (InX[L]=InX[K]) And (SH[L,J]=1) Then
      If C=0 Then C:= InY[L] Else D:= InY[L];
      If (A=C) And (B=D) Then
      For L:= 1 To MX Do
      If (InX[L]<>InX[I]) And (InX[L]<>InX[K]) And
      ((InY[L]=A) Or (InY[L]=B)) Then
      Begin For M:= 1 To Max Do If M<>J Then SH[L,J]:= 0 End;
    End;
  End;
End;

 

Y-Wing (YW)

 

         A metódus: Ha három jelölt (legyenek: A, B és C) úgy helyezkedik el egy derékszögű háromszög csúcsainak megfelelő cellákban, hogy mindegyikben pontosan kettő, de bármely két cella jelöltjei között csak egy közös található (azaz: A és B, A és C valamint B és C), akkor a hegyesszögű csúcsok sorának illetve oszlopának metszésében lévő cellából a hegyesszögű csúcsokban lévő cellák közös jelöltje törölhető. A következő feladványban a metódusnak megfelelő három cella G1, D7 és G7, melyekben csak a 2, 4 és 8-as jelöltek találhatók, és bármelyik kettőnek csak egy közös jelöltje van. A negyedik cella a D1-es, melyből a G1 és D7 közös jelöltje a 2-es törölhető.

 

 

Az YW bekapcsolása után ezt látjuk:

 

 

Az Y-Wing rutinja:

 

Function Hossz(K: KTomb): Word;
Var I, N: Word;
Begin
  N:= 0; For I:= 1 To Max Do If K[I]=1 Then Inc(N); Hossz:= N;
End;

Function Metszet(A, B: KTomb): KTomb;
Var I: Word;
    P: KTomb;
Begin
  P:= A; For I:= 1 To Max Do P[I]:= A[I]*B[I]; Metszet:= P;
End;

Function Unio(A, B, C: KTomb): KTomb;
Var I: Word;
    P: KTomb;
Begin
  P:= A;
  For I:= 1 To Max Do Begin P[I]:= A[I]+B[I]+C[I]; If P[I]>0 Then P[I]:= 1 End;
  Unio:= P;
End;

Procedure YWing;
Var I, J, K: Word;
Begin
  //Y-Wing
  //ha harom szam (A, B es C) ugy helyezkedik el egy derekszogu haromszog
  //csucsainak megfelelo helyeken, hogy mindegyikben pontosan ketto,
  //de barmely ket hely szamai kozott csak egy kozos talalhato
  //(azaz: A és B, A és C valamint B és C), akkor a hegyesszogu csucsok soranak
  //es oszlopanak metszeseben levo helyrol a hegyesszogu csucsokban levo
  //helyek kozos szama torolheto
  For I:= 1 To MX Do If SM[I]=0 Then
  If Hossz(SH[I])=2 Then
  For J:= 1 To Max Do If (TIndex[J,InY[I]]<>I) And (SM[TIndex[J,InY[I]]]=0) Then
  If Hossz(SH[TIndex[J,InY[I]]])=2 Then
  For K:= 1 To Max Do If (TIndex[InX[I],K]<>I) And (SM[TIndex[InX[I],K]]=0) Then
  If Hossz(SH[TIndex[InX[I],K]])=2 Then
  If (Hossz(Metszet(SH[I],SH[TIndex[J,InY[I]]]))=1) Then
  If (Hossz(Metszet(SH[I],SH[TIndex[InX[I],K]]))=1) Then
  If (Hossz(Metszet(SH[TIndex[J,InY[I]]],SH[TIndex[InX[I],K]]))=1) Then
  If (Hossz(Unio(SH[I],SH[TIndex[J,InY[I]]],SH[TIndex[InX[I],K]]))=3) Then
  SH[TIndex[J,K]]:=
  Kivesz(SH[TIndex[J,K]],Metszet(SH[TIndex[J,InY[I]]],SH[TIndex[InX[I],K]]));
End;